/**
 * @class eli18n
 * Javascript applications localization
 *
 * @param Object o - class options. Object. {textdomain : 'имя_группы_сообщений', messages : {textdomain1 : {}[, textdomain2 : {}]...}}
 *
 * Usage:
 *
 * var msgs = { Hello : 'Превэд', 'Hello %user' : 'Превед %user' };
 * //load messages and set default textdomain
 * var translator = new eli18n( {textdomain : 'test', messages : {test : msgs}} )
 * window.console.log(translator.translate('Hello'));
 * window.console.log(translator.format('Hello %user', {user : 'David Blain'}))
 * // create new textdomain
 * translator.load({test2 : {'Goodbye' : 'Ja, deva mata!'} })
 * // and use it, without changing default one
 * window.console.log(translator.translate('Goodbye', 'test2'));
 *
 * @author:    Dmitry (dio) Levashov dio@std42.ru
 * license:   BSD license
 **/
function eli18n(o) {

    /**
     * Get/set default textdomain
     *
     * @param String d new textdomain name
     * @return String  default textdomain
     **/
    this.textdomain = function (d) {
        return this.messages[d] ? this._domain = d : this._domain;
    }

    o && o.messages && this.load(o.messages);
    o && o.textdomain && this.textdomain(o.textdomain);
}

eli18n.prototype = new function () {

    /**
     * @var Object messages (key - messages in English or message handler, value - message in selected language)
     **/
    this.messages = {};
    /**
     * @var String default textdomain
     **/
    this._domain = '';

    /**
     * Load new messages
     *
     * @param Object msgs - messages (key - textdomain name, value - messages Object)
     * @return Object this
     **/
    this.load = function (msgs) {
        if (typeof(msgs) == 'object') {
            for (var d in msgs) {
                var _msgs = msgs[d];
                if (typeof(_msgs) == 'object') {
                    if (!this.messages[d]) {
                        this.messages[d] = {};
                    }
                    for (var k in _msgs) {
                        if (typeof(_msgs[k]) == 'string') {
                            this.messages[d][k] = _msgs[k];
                        }
                    }
                }
            }
        }
        return this;
    }

    /**
     * Return translated message, if message exists in required or default textdomain, otherwise returns original message
     *
     * @param  String msg - message
     * @param  String d - textdomain. If empty, default textdomain will be used
     * @return String translated message
     **/
    this.translate = function (msg, d) {
        var d = d && this.messages[d] ? d : this._domain;
        return this.messages[d] && this.messages[d][msg] ? this.messages[d][msg] : msg;

    }

    /**
     * Translate message and replace placeholders (%placeholder)
     *
     * @param  String  msg - message
     * @param  Object  replacement for placeholders (keys - placeholders name without leading %, values - replacements)
     * @param  String  d - textdomain. If empty, default textdomain will be used
     * @return String  translated message
     **/
    this.format = function (msg, data, d) {
        msg = this.translate(msg, d);
        if (typeof(data) == 'object') {
            for (var i in data) {
                msg = msg.replace('%' + i, this.translate(data[i], d));
            }
        }
        return msg;
    }
}
